Fix fat jar build and update dependencies#146
Merged
Conversation
…n CI - Pin net.minestom:minestom to 2026.05.17-1.21.11 (current Maven Central release) instead of the BOM-resolved version so the deployable jar runs on the latest Minestom regardless of aonyx/mycelium BOM lag. - Bump butterfly 1.0.21 -> 1.0.23 to match the current Butterfly release. - Harden the application shadowJar: strip jar signatures and module-info and exclude duplicates so the relocation-free fat jar built from the shaded LuckPerms fork stays loadable. - Pin the reusable PR/publish workflows to the v2.1.0 release tag instead of a temporary branch ref. https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
Contributor
Job Summary for GradleBuild PR :: build
|
2 similar comments
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Test results 63 files 63 suites 39s ⏱️ Results for commit 0e067e1. ♻️ This comment has been updated with latest results. |
Titan shaded net.luckperms common/minestom/minestom-app/loader-utils into the relocation-free fat jar and bootstrapped LPMinestomBootstrap directly on the app classpath, defeating LuckPerms' dependency isolation. Switch to the LuckPerms-designed loader: - depend on net.luckperms:minestom-loader (runtimeOnly, not shaded) - net.luckperms:api becomes a runtime (implementation) dependency so LuckPermsProvider resolves on the host classpath while the JarInJar child loads the isolated implementation against the same API classes - drop Titan's custom MinestomLoader; TitanApplication now uses the fork's me.lucko.luckperms.minestom.loader.MinestomLoader - add the minestom-loader version catalog entry - generalise the shadowJar signature/module-info hardening comment https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
Contributor
Job Summary for GradleBuild PR :: build
|
TitanApplication references me.lucko.luckperms.minestom.loader.MinestomLoader directly, so the loader is needed at compile time; runtimeOnly removed it from compileClasspath and broke compilation. Use implementation: the minestom-loader artifact is a thin JarInJar wrapper with no heavy transitive dependencies (adventure/configurate live inside the embedded luckperms-minestom.jarinjar resource), so this does not reintroduce raw shading of common/minestom. https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
Contributor
Job Summary for GradleBuild PR :: build
|
5 similar comments
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
Pinning Minestom to 2026.05.17-1.21.11 decoupled it from the OLF BOM that also governs the cyano test harness; cyano 0.7.1 was built against an older Minestom, so RegistryData's static initializer threw NoSuchMethodError and all Minestom-backed tests failed. aonyx-bom 0.7.2 aligns cyano with Minestom 2026.05.17-1.21.11. https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
Contributor
Job Summary for GradleBuild PR :: build
|
2 similar comments
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
enforcedPlatform(mycelium-bom) pinned net.kyori:adventure-* classpath- wide; the pinned Adventure was older than Minestom 2026.05.17-1.21.11 requires, so MinestomFlattenerProvider.<clinit> failed with NoSuchMethodError: ComponentFlattener.toBuilder(). Switching to platform(...) keeps the BOM as a version recommendation that Gradle can upgrade to satisfy Minestom's transitive Adventure version requirement. Applied in :common and :setup, the two modules using enforcedPlatform. https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP
Contributor
Job Summary for GradleBuild PR :: build
|
2 similar comments
Contributor
Job Summary for GradleBuild PR :: build
|
Contributor
Job Summary for GradleBuild PR :: build
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
aonyx-bom 0.7.2 was never published (latest release is 0.7.3); bump to the existing version. Also align mycelium-bom to 1.6.5, let minestom be managed by the BOM, bump aves to 1.14.0, and trim the unused LuckPerms catalog entries down to the minestom-loader. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switch luckperms-api and minestom-loader to compileOnly/runtimeOnly and exclude net.kyori.adventure so the bundled adventure version wins. The aonyx-bom platform is no longer applied in :app (minestom comes via the catalog), and the loader is invoked by FQN in TitanApplication. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-deployment-XhoNO # Conflicts: # app/build.gradle.kts # settings.gradle.kts
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
aves 1.14.1 reworked BaseMap into an immutable type: accessors are now name()/spawn()/builders() (List<String>) instead of getName()/getSpawn()/ getBuilders(), there are no setters, and the only constructor is BaseMap(String, Pos, List<String>). Give LobbyMap a matching constructor, build instances through it in LobbyMapBuilder (dropping the dead setter calls), and update MapProvider, the app/setup listeners and the tests to the new accessors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
aonyx-bom already brings mycelium-bom transitively, so the explicit mycelium-bom platform was redundant (per Steffen). Remove it everywhere and the catalog entry, and re-apply aonyx-bom in :app (main + test) so all modules resolve the same managed versions instead of skewing — :app was pulling aves 1.14.0 while the BOM pinned 1.14.1. Pin aves to 1.14.1 in the catalog to match. Also keep the LuckPerms minestom-loader off the test runtime classpath: it is a JarInJar bootstrap bundling an unrelocated, outdated Gson that otherwise shadows the real one and breaks Minestom registry init (GsonBuilder.disableJdkUnsafe NoSuchMethodError). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Minestom 2026 ships Adventure 5, whose Key is an interface Gson cannot
instantiate, so loading app.json failed ("Interfaces can't be
instantiated: net.kyori.adventure.key.Key"). Register aves'
KeyGsonAdapter (via registerTypeHierarchyAdapter so it also covers Key
implementations on write) and migrate the committed app.json from the old
reflective {domain,path} shape to the adapter's {namespace,value}.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CloudNet only provides its runtime when a service is started through its wrapper, which creates a .wrapper directory in the working directory. Guard the MinestomBridgeExtension load on that directory so the server boots standalone (local runs, tests, AOT training) instead of failing in CloudNet's injector with "Cannot construct abstract type EventManager". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The bundled worlds were saved by older Minecraft versions (DataVersion 3120/3337/3700 = 1.19.4/1.20.1/1.20.4) and failed to load on Minestom 2026 (1.21.11) with "Unknown block minecraft:chain" - the generic chain block was renamed to iron_chain in 1.21.x. Ran Mojang's 1.21.11 server --forceUpgrade over every world (worlds/ and test-server/worlds/) to run the official DataFixerUpper, bringing all chunks to DataVersion 4671. Server-generated cruft (nether/end dims, datapacks, structure indexes) was excluded. The lobby now boots standalone and binds in ~2s. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a generateAotCache task that boots the shaded lobby once (JDK 25, JEP 514 -XX:AOTCacheOutput) and records a portable AOT cache, trained with the relative classpath "app-titan.jar". The cache is published as the "aot" classifier artifact next to titan-app.jar. Deploy with the matching launch to get the speedup (~1.7s -> ~0.75s to listening in local tests): java -XX:AOTCache=app-titan.aot -jar app-titan.jar A gated -Dtitan.aot.trainSeconds hook in TitanApplication shuts the server down cleanly after startup so the training JVM writes the cache. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR addresses issues with the fat jar build process and updates project dependencies to their latest versions.
Key Changes
META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA)module-info.class,META-INF/versions/**/module-info.class)duplicatesStrategy = DuplicatesStrategy.EXCLUDEto handle duplicate entries1.0.21→1.0.232026.05.17-1.21.11v2.1.0for both build and publish workflowsImplementation Details
The fat jar exclusions specifically target artifacts pulled by LuckPerms'
commonmodule that contain signed JARs and multi-release JAR metadata. These were causing conflicts in the final application JAR. TheduplicatesStrategysetting ensures consistent handling of any remaining duplicate entries during the merge process.https://claude.ai/code/session_01S76fk9ma5Szkf9r1W44RVP